<!doctype html>



  


<html class="theme-next mist use-motion" lang="zh-Hans">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>



<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />















  
  
  <link href="/blog/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />




  
  
  
  

  
    
    
  

  

  

  

  

  
    
    
    <link href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
  






<link href="/blog/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/blog/css/main.css?v=5.1.0" rel="stylesheet" type="text/css" />


  <meta name="keywords" content="Elasticsearch,随记," />








  <link rel="shortcut icon" type="image/x-icon" href="/blog/favicon.ico?v=5.1.0" />






<meta name="description" content="主分片主分片的数量在新建索引的时候就确定好了，Elasticsearch会决定将索引的数据存到那个分片上，一个分片是一个完整的Lucene实例，是一个完整的搜索实例。索引分片数量决定了索引可存储的数据量。（好像可以通过扩展副本分片的数量来提高性能？） 副分片副分片是主分片的拷贝，数据冗余。相同分片的副本分片不会存放到同一个节点。 2、默认一个主分片（primary）对应一个副分片（replics）">
<meta name="keywords" content="Elasticsearch,随记">
<meta property="og:type" content="article">
<meta property="og:title" content="Elasticsearch随记">
<meta property="og:url" content="https://gitee.com/shuhao/2017/12/15/Elasticsearch随记/index.html">
<meta property="og:site_name" content="Niki">
<meta property="og:description" content="主分片主分片的数量在新建索引的时候就确定好了，Elasticsearch会决定将索引的数据存到那个分片上，一个分片是一个完整的Lucene实例，是一个完整的搜索实例。索引分片数量决定了索引可存储的数据量。（好像可以通过扩展副本分片的数量来提高性能？） 副分片副分片是主分片的拷贝，数据冗余。相同分片的副本分片不会存放到同一个节点。 2、默认一个主分片（primary）对应一个副分片（replics）">
<meta property="og:locale" content="zh-Hans">
<meta property="og:image" content="https://gitee.com/blog/images/elk/structure.jpg">
<meta property="og:updated_time" content="2017-12-25T12:25:19.603Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Elasticsearch随记">
<meta name="twitter:description" content="主分片主分片的数量在新建索引的时候就确定好了，Elasticsearch会决定将索引的数据存到那个分片上，一个分片是一个完整的Lucene实例，是一个完整的搜索实例。索引分片数量决定了索引可存储的数据量。（好像可以通过扩展副本分片的数量来提高性能？） 副分片副分片是主分片的拷贝，数据冗余。相同分片的副本分片不会存放到同一个节点。 2、默认一个主分片（primary）对应一个副分片（replics）">
<meta name="twitter:image" content="https://gitee.com/blog/images/elk/structure.jpg">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/blog/',
    scheme: 'Mist',
    sidebar: {"position":"right","display":"post","offset":12,"offset_float":0,"b2t":false,"scrollpercent":false},
    fancybox: true,
    motion: true,
    duoshuo: {
      userId: '0',
      author: '博主'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="https://gitee.com/shuhao/2017/12/15/Elasticsearch随记/"/>





  <title> Elasticsearch随记 | Niki </title>
</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  





  <script type="text/javascript">
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "https://hm.baidu.com/hm.js?cb9f0585e406f878cb2f29c89ad3cdb7";
      var s = document.getElementsByTagName("script")[0];
      s.parentNode.insertBefore(hm, s);
    })();
  </script>










  
  
    
  

  <div class="container one-collumn sidebar-position-right page-post-detail ">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/blog/"  class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">Niki</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle">天道酬勤</p>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/blog/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/blog/categories" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-categories"></i> <br />
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/blog/archives" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            归档
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/blog/tags" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />
            
            标签
          </a>
        </li>
      

      
    </ul>
  

  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
    <link itemprop="mainEntityOfPage" href="https://gitee.com/shuhao/blog/2017/12/15/Elasticsearch随记/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Fang ShuHao">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/blog/images/head.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="Niki">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                Elasticsearch随记
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2017-12-15T20:09:05+08:00">
                2017-12-15
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/blog/categories/Elasticsearch/" itemprop="url" rel="index">
                    <span itemprop="name">Elasticsearch</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        <h2 id="主分片"><a href="#主分片" class="headerlink" title="主分片"></a>主分片</h2><p>主分片的数量在新建索引的时候就确定好了，Elasticsearch会决定将索引的数据存到那个分片上，一个分片是一个完整的Lucene实例，是一个完整的搜索实例。索引分片数量决定了索引可存储的数据量。（好像可以通过扩展副本分片的数量来提高性能？）</p>
<h2 id="副分片"><a href="#副分片" class="headerlink" title="副分片"></a>副分片</h2><p>副分片是主分片的拷贝，数据冗余。相同分片的副本分片不会存放到同一个节点。</p>
<p>2、默认一个主分片（primary）对应一个副分片（replics），可以修改主分片对应副分片的个数：<br>    将主分片对应的副分片个数设置为2个<br><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">PUT /indexName/_settings</span><br><span class="line">&#123;</span><br><span class="line">   &quot;number_of_replicas&quot; : 2</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p>
<h2 id="数据存储"><a href="#数据存储" class="headerlink" title="数据存储"></a>数据存储</h2><ul>
<li><p>_index 索引：类似mysql的数据库。名字必须小写，不能以下划线开头，不能包含逗号。<br>索引可存储在一个或多个分片中。</p>
</li>
<li><p>_type 类型：类似mysql数据库中的表， 命名可以是大写或者小写，但是不能以下划线或者句号开头，不应该包含逗号， 并且长度限制为256个字符。</p>
</li>
<li><p>document 文档：类似mysql数据库中的一条记录。</p>
</li>
<li><p>_id 文档id，可自行提供，也可由Elasticsearch自动生成。</p>
</li>
</ul>
<p><em>对Elasticsearch中文档的操作路径/index/type/id</em></p>
<h2 id="文档的更新"><a href="#文档的更新" class="headerlink" title="文档的更新"></a>文档的更新</h2><p>在Elasticsearch中，对文档的CRUD操作中，文档的更新操作比较特殊。<br>在Elasticsearch中，文档是<em>不可改变</em>的。如果想要更新现有文档，需要<em>重建索引</em>或者<em>进行替换</em>。<br>进行文档更新时，在内部，Elasticsearch已将旧文档标记为<em>删除</em>，并新增一个全新的文档；但是，旧文档不会立即消失。当继续索引更多的数据，Elasticsearch会在后台清理这些已删除的文档。<br>新更新的文档，version字段会自动加1。</p>
<h2 id="Elasticsearch并发控制"><a href="#Elasticsearch并发控制" class="headerlink" title="Elasticsearch并发控制"></a>Elasticsearch并发控制</h2><p>当多个进程并发更改Elasticsearch中同一个document时，Elasticsearch如何控制。我们知道，mysql数据库采用的是悲观锁的方式：当有进程更新一条记录时，会对该记录加锁，在该记录上的行级锁未释放时，其它进程都必须等待获取锁之后才能操作。<br>Elasticsearch采用了不同的策略，使用的是乐观锁的形式：每个文档的元数据中都有一个字段_version来记录当前文档的版本。每次更改文档，_version字段加1，在并发修改的情况下，如果修改请求_version小于当前Elasticsearch中保存的_version，请求失败。客户端后去失败的信息自行进行处理。</p>
<ul>
<li>修改带上_version<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">PUT /books/programming/y0eMWWABKEoL6GzGtJBd?version=1</span><br><span class="line">&#123;</span><br><span class="line">	&quot;name&quot;: &quot;Thinking in Java&quot;,</span><br><span class="line">    &quot;author&quot;: &quot;Bruce Eckel&quot;,</span><br><span class="line">    &quot;price&quot;: 130</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>失败信息：<br><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">&#123;</span><br><span class="line">   &quot;error&quot;: &#123;</span><br><span class="line">      &quot;root_cause&quot;: [</span><br><span class="line">         &#123;</span><br><span class="line">            &quot;type&quot;: &quot;version_conflict_engine_exception&quot;,</span><br><span class="line">            &quot;reason&quot;: &quot;[blog][1]: version conflict, current [2], provided [1]&quot;,</span><br><span class="line">            &quot;index&quot;: &quot;website&quot;,</span><br><span class="line">            &quot;shard&quot;: &quot;3&quot;</span><br><span class="line">         &#125;</span><br><span class="line">      ],</span><br><span class="line">      &quot;type&quot;: &quot;version_conflict_engine_exception&quot;,</span><br><span class="line">      &quot;reason&quot;: &quot;[blog][1]: version conflict, current [2], provided [1]&quot;,</span><br><span class="line">      &quot;index&quot;: &quot;website&quot;,</span><br><span class="line">      &quot;shard&quot;: &quot;3&quot;</span><br><span class="line">   &#125;,</span><br><span class="line">   &quot;status&quot;: 409</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p>
<p><a href="https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/optimistic-concurrency-control.html#optimistic-concurrency-control" target="_blank" rel="external">Elasticsearch乐观并发控制</a></p>
<h2 id="批量查找"><a href="#批量查找" class="headerlink" title="批量查找"></a>批量查找</h2><p>mget<br>docs ids</p>
<h2 id="Elasticsearch全文搜索"><a href="#Elasticsearch全文搜索" class="headerlink" title="Elasticsearch全文搜索"></a>Elasticsearch全文搜索</h2><p>Elasticsearch全文搜索采用的是<em>倒排索引</em>的方式。将所有的字符与全文做索引。</p>
<h2 id="Elasticsearch分析器"><a href="#Elasticsearch分析器" class="headerlink" title="Elasticsearch分析器"></a>Elasticsearch分析器</h2><ul>
<li>字符过滤器</li>
<li>分词器</li>
<li>词单元过滤器</li>
</ul>
<h4 id="自定义分析器"><a href="#自定义分析器" class="headerlink" title="自定义分析器"></a>自定义分析器</h4><p><em>该分析器不是全局的，只在index_name这个索引中有效。</em><br><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">PUT /index_name</span><br><span class="line">&#123;</span><br><span class="line">	&quot;settings&quot;:&#123;</span><br><span class="line">		&quot;analysis&quot;:&#123;</span><br><span class="line"></span><br><span class="line">			&quot;char_filter&quot;:&#123;</span><br><span class="line">				&quot;&amp;_to_and&quot;:&#123;</span><br><span class="line">					&quot;type&quot;:&quot;mapping&quot;,</span><br><span class="line">					&quot;mappings&quot;:[&quot;&amp;=&gt; and&quot;]</span><br><span class="line">				&#125;</span><br><span class="line">			&#125;,</span><br><span class="line">			&quot;filter&quot;:&#123;</span><br><span class="line">				&quot;my_stopwords&quot;:&#123;</span><br><span class="line">					&quot;type&quot;:&quot;stop&quot;,</span><br><span class="line">					&quot;stopwords&quot;:[&quot;the&quot;, &quot;a&quot;]</span><br><span class="line">				&#125;</span><br><span class="line">			&#125;,</span><br><span class="line">			&quot;analyzer&quot;:&#123;</span><br><span class="line">				&quot;my_analyzer&quot;:&#123;</span><br><span class="line">					&quot;type&quot;:&quot;custom&quot;,</span><br><span class="line">					&quot;char_filter&quot;:[&quot;html_strip&quot;, &quot;&amp;_to_and&quot;],</span><br><span class="line">					&quot;tokenizer&quot;:&quot;standard&quot;,</span><br><span class="line">					&quot;filter&quot;:[&quot;lowercase&quot;, &quot;my_stopwords&quot;]</span><br><span class="line">				&#125;</span><br><span class="line">			&#125;</span><br><span class="line"></span><br><span class="line">		&#125;</span><br><span class="line">	&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p>
<p><em>char_filter</em> 为分析器中<em>字符过滤器</em>。比如Elasticsearch中内置的去除html标签的 <em>html_strip</em> 字符过滤器，以及我们自定义的<em>&amp;_to_and</em>字符过滤器（将&amp;符号转换为and）</p>
<p><em>filter</em> 为<em>词单元过滤器</em>。比如Elasticsearch中内置的<em>lowercase</em>词单元过滤器，分词时，全部转换为小写。 以及我们自定义的词单元过滤器<em>my_stopwords</em>，分词时，过滤掉”the”、”a”这两个没有实际意义的单词。</p>
<p><em>analyzer</em> 为 <em>分词器</em>，定义了如何将文档进行分词，用来创建文档与词之间的索引以便进行全文查询。Elasticsearch中默认使用<em>standard</em>标准分词器。这里，我们自定义了自己的分词器 <em>custom</em> 其中集成了standard分词器，并且采用了我们自定义的字符过滤器以及词单元过滤器。</p>
<h4 id="使用自定义分析器"><a href="#使用自定义分析器" class="headerlink" title="使用自定义分析器"></a>使用自定义分析器</h4><ol>
<li><p>保存的文档进行分析</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">GET /index_name/_analyzer</span><br><span class="line">&#123;</span><br><span class="line">	&quot;analyzer&quot;:&quot;my_analyzer&quot;,</span><br><span class="line">	&quot;text&quot;:&quot;The quick &amp; brown fox&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
</li>
<li><p>插入文档时使用</p>
</li>
</ol>
<ul>
<li>设置对field_name进行分析时使用my_analyzer这个分析器 *<br>只能对新添加字段进行设置，无法修改原来已有的参数。异常（”reason”: “Mapper for [remark] conflicts with existing mapping in other types:\n[mapper [remark] has different [analyzer]]”）<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">PUT /index_name/_mapping/type_name</span><br><span class="line">&#123;</span><br><span class="line">	&quot;properties&quot;:&#123;</span><br><span class="line">		&quot;field_name&quot;:&#123;</span><br><span class="line">			&quot;type&quot;:&quot;string&quot;,</span><br><span class="line">			&quot;analyzer&quot;:&quot;my_analyzer&quot;</span><br><span class="line">		&#125;</span><br><span class="line">	&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>字符与文章索引前需要对文章进行分析处理。Elasticsearch主要进行一下这些处理</p>
<ul>
<li>字符过滤</li>
<li>分词器 （标准分词器:standard ，简单分词器:simple，空格分词器:whitespace， 语言分词器:english,…）</li>
<li>Token过滤</li>
</ul>
<p>我们可以通过API来预先查看Elasticsearch如何对文本进行分词处理的<br><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">GET /_analyze</span><br><span class="line">&#123;</span><br><span class="line">	&quot;analyzer&quot;:&quot;standard&quot;,</span><br><span class="line">	&quot;text&quot;:&quot;Niki like programmming!&quot;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#123;</span><br><span class="line">  &quot;tokens&quot;: [</span><br><span class="line">    &#123;</span><br><span class="line">      &quot;token&quot;: &quot;niki&quot;,</span><br><span class="line">      &quot;start_offset&quot;: 0,</span><br><span class="line">      &quot;end_offset&quot;: 4,</span><br><span class="line">      &quot;type&quot;: &quot;&lt;ALPHANUM&gt;&quot;,</span><br><span class="line">      &quot;position&quot;: 0</span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      &quot;token&quot;: &quot;like&quot;,</span><br><span class="line">      &quot;start_offset&quot;: 5,</span><br><span class="line">      &quot;end_offset&quot;: 9,</span><br><span class="line">      &quot;type&quot;: &quot;&lt;ALPHANUM&gt;&quot;,</span><br><span class="line">      &quot;position&quot;: 1</span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      &quot;token&quot;: &quot;programmming&quot;,</span><br><span class="line">      &quot;start_offset&quot;: 10,</span><br><span class="line">      &quot;end_offset&quot;: 22,</span><br><span class="line">      &quot;type&quot;: &quot;&lt;ALPHANUM&gt;&quot;,</span><br><span class="line">      &quot;position&quot;: 2</span><br><span class="line">    &#125;</span><br><span class="line">  ]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p>
<p><a href="https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/analysis-intro.html#analysis-intro" target="_blank" rel="external">Elasticsearch分析</a></p>
<h2 id="Elasticsearch-查询与过滤"><a href="#Elasticsearch-查询与过滤" class="headerlink" title="Elasticsearch 查询与过滤"></a>Elasticsearch 查询与过滤</h2><ul>
<li>在Elasticsearch中，查询（query）类似于模糊匹配，并且会给出结果与查询参数的匹配值score</li>
<li>Elasticsearch中过滤（filter）则是类似于精确查询</li>
<li>在Elasticsearch早起版本，查询与过滤是两个组件，但在2.0以后的版本中，Elasticsearch将filter过滤技术排除，并且所有的查询query都可以变成_不计算匹配值_score的查询</li>
<li>Elasticsearch会将filter的结果进行缓存，而不会缓存query的结果，所以，就性能来说，filter过滤的性能会好与query查询。（因为query查询还要计算匹配值，所以结果不缓存）</li>
<li></li>
</ul>
<h2 id="搜索，查找语法"><a href="#搜索，查找语法" class="headerlink" title="搜索，查找语法"></a>搜索，查找语法</h2><h3 id="简单查询"><a href="#简单查询" class="headerlink" title="简单查询"></a>简单查询</h3><p>1、全文查询<br><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/index/type/_search?q=&quot;&quot;</span><br></pre></td></tr></table></figure></p>
<p>2、字段查询（并不会对字段进行精确过滤）<br><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/index/type/_search?q=field:value</span><br></pre></td></tr></table></figure></p>
<p>当使用<em>match</em>来查询时，Elasticsearch会用正确的分析器来分析查询的<em>字符串</em>（意味着类似模糊匹配。score）。如果在match上查询如：数字，布尔，日期或者是一个no_analysize字符串，那么Elasticsearch会精确匹配match</p>
<h2 id="排序相关性"><a href="#排序相关性" class="headerlink" title="排序相关性"></a>排序相关性</h2><p>+1、 Elasticsearch中对字符串进行排序时，如果字符串是analyzed时，会消耗大量的内存，所以，如果需要对字符串进行排序时，最好确保该字段是not_analyzed。如果该字符串有要进行全文查询，又要进行排序的话，有两种解决方案：<br>1.1、在index中保存两个相同的field，一个设为analyzed用来全文查询，另一个field保存为not_analyzed用来进行排序。不过这样会造成空间的浪费<br>1.2、采用多字段映射，使用子字段。如：<br><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">&quot;tweet&quot;: &#123;</span><br><span class="line">    &quot;type&quot;:     &quot;string&quot;,</span><br><span class="line">    &quot;analyzer&quot;: &quot;english&quot;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&quot;tweet&quot;: &#123;</span><br><span class="line">    &quot;type&quot;: &quot;string&quot;,</span><br><span class="line">    &quot;analyzer&quot;: &quot;english&quot;</span><br><span class="line">    &quot;fields&quot;:&#123;</span><br><span class="line">    	&quot;raw&quot;:&#123;</span><br><span class="line">    		&quot;type&quot;: &quot;string&quot;,    		</span><br><span class="line">    		&quot;index&quot;:&quot;not_analyzed&quot;</span><br><span class="line">    	&#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p>
<p>当我们进行全文查询的时候，使用tweet，当我们需要进行排序的时候，使用tweet.raw<br><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">match&#123;</span><br><span class="line">	&quot;tweet&quot;:&quot;&quot;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">sort:&#123;</span><br><span class="line">	tweet.raw:&#123;</span><br><span class="line">		&quot;order&quot;:&quot;desc&quot;</span><br><span class="line">	&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p>
<h2 id="Elasticserach分片存储"><a href="#Elasticserach分片存储" class="headerlink" title="Elasticserach分片存储"></a>Elasticserach分片存储</h2><p>Elasticsearch中数据存储结构为：</p>
<ol>
<li>Elasticsearch数据存储在<strong><em>分片</em></strong>中，默认Elasticsearch中有5个分片</li>
<li>在每隔分片中，包含一个<strong><em>提交点</em></strong>和若干个<strong><em>数据段</em></strong>。<br>注：<br>提交点：是一个列出所有已知段的文件<br>段：本身是一个倒排索引，保存数据（Elasticsearch中数据结构就是<strong><em>倒排索引</em></strong>）</li>
</ol>
<img src="/blog/images/elk/structure.jpg">
<h3 id="如何存储数据"><a href="#如何存储数据" class="headerlink" title="如何存储数据"></a>如何存储数据</h3><p>Elasticsearch中的数据结构是倒排索引，文档被存到分片中，每个分片都能进行Lucene搜索。Elasticsearch为了提高搜索的效率，将数据分段存储在片中（在Lucene中<strong><em>分片</em></strong>的概念是<strong><em>索引</em></strong>）（~——~ 颠覆了我对数据库的认识），并且存储数据的分段是不会删除的，只是添加删除标记，搜索时遍历所有的分段，最后将各个分段搜索的数据进行合并，并且去掉删除的数据返回给客户端。</p>
<h3 id="数据如何保存、更新"><a href="#数据如何保存、更新" class="headerlink" title="数据如何保存、更新"></a>数据如何保存、更新</h3><ol>
<li>用户提交数据</li>
<li>数据保存在<strong>内存缓存</strong>中</li>
<li>数据refresh到<strong>文件系统缓存</strong>中并被写入到一个新段，在<strong><em>提交点</em></strong>上进行记录</li>
<li>数据flush到本地硬盘（一个提交点被写入到硬盘），并且清空缓存内存，以及translog</li>
<li>数据段进行合并，并且删除被<strong>标记为删除的数据段</strong></li>
</ol>
<h3 id="如何提升数据存储性能、安全性"><a href="#如何提升数据存储性能、安全性" class="headerlink" title="如何提升数据存储性能、安全性"></a>如何提升数据存储性能、安全性</h3><h6 id="保存到内存缓存"><a href="#保存到内存缓存" class="headerlink" title="保存到内存缓存"></a>保存到内存缓存</h6><ol>
<li>因为Elasticsearch中保存数据的性能瓶颈在<strong><em>磁盘IO</em></strong>，所以在用户保存数据时，先将数据保存到内存缓存中。</li>
<li>然而为了保证数据的安全性（保证数据物理性的写入磁盘），那么我们必须要fsync将数据落盘。但是fsync的代价很大，但是又要保障加入的文档可以被搜索，因此在硬盘和内存缓存之间，又加了一层<strong><em>文件系统缓存</em></strong>。只要文档被加入到<strong><em>文件系统缓存</em></strong>中，就可以被搜索，此时，并没有fsync真正将文档保存为一个数据段保存到磁盘上。Elasticsearch默认一秒refresh一次。refresh会将数据保存到<strong><em>文件系统缓存</em></strong>并且清空<strong><em>内存缓存空间</em></strong>。</li>
<li>为了保证数据的安全性，Elasticsearch在refresh数据到文件系统缓存中时，同时会将Elasticsearch操作的日志追加到translog中进行记录（感觉所有的数据库系统保证数据安全性的套路都差不多Mongo为oplog）。并且refresh不会清空translog</li>
<li>Elasticsearch每隔30分钟，或者translog过大时；将<strong><em>文件系统缓存</em></strong>中的数据fsync到硬盘，此时所有<strong><em>内存缓存</em></strong>区中数据被写入提交点上一个新段，并且被清空个，提交点上的一个新段被fsync到硬盘，translog也被清空。准备接受另一个新段的数据</li>
</ol>
<h3 id="近实时更新数据以及如何配置"><a href="#近实时更新数据以及如何配置" class="headerlink" title="近实时更新数据以及如何配置"></a><strong><em>近</em></strong>实时更新数据以及如何配置</h3><p>他们索引了一个文档然后尝试搜索它，但却没有搜到。这个问题的解决办法是用 refresh API 执行一次手动刷新<br><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">POST /_refresh </span><br><span class="line">POST /index_name/_refresh</span><br></pre></td></tr></table></figure></p>
<p>对于实时性不高，不需要每秒都刷新的数据可以如下配置<br><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">PUT /index_name</span><br><span class="line">&#123;</span><br><span class="line">  &quot;settings&quot;: &#123;</span><br><span class="line">    &quot;refresh_interval&quot;: &quot;30s&quot; </span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p>
<p>refresh_interval 可以在既存索引上进行动态更新。</p>
<blockquote>
<blockquote>
<blockquote>
<p>参考<br><a href="https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/inside-a-shard.html" target="_blank" rel="external">分片的内部原理</a></p>
</blockquote>
</blockquote>
</blockquote>

      
    </div>

    <div>
      
        

      
    </div>

    <div>
      
        

      
    </div>


    <footer class="post-footer">
      
        <div class="post-tags">
          
            <a href="/blog/tags/Elasticsearch/" rel="tag"># Elasticsearch</a>
          
            <a href="/blog/tags/随记/" rel="tag"># 随记</a>
          
        </div>
      

      
        
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/blog/2017/12/15/redis随记/" rel="next" title="redis随记">
                <i class="fa fa-chevron-left"></i> redis随记
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/blog/2017/12/16/Mongo查询分析以及索引规则二/" rel="prev" title="Mongo查询分析以及索引规则二">
                Mongo查询分析以及索引规则二 <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </article>



    <div class="post-spread">
      
    </div>
  </div>

          
          </div>
          


          
  <div class="comments" id="comments">
    
      <div id="lv-container" data-id="city" data-uid="MTAyMC8zNjY5NS8xMzIzMA=="></div>
    
  </div>


        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
          <img class="site-author-image" itemprop="image"
               src="/blog/images/head.jpg"
               alt="Fang ShuHao" />
          <p class="site-author-name" itemprop="name">Fang ShuHao</p>
           
              <p class="site-description motion-element" itemprop="description"></p>
          
        </div>
        <nav class="site-state motion-element">
        
          
            <div class="site-state-item site-state-posts">
              <a href="/blog/archives">
                <span class="site-state-item-count">135</span>
                <span class="site-state-item-name">日志</span>
              </a>
            </div>
          

          
            <div class="site-state-item site-state-categories">
              <a href="/blog/categories">
                <span class="site-state-item-count">35</span>
                <span class="site-state-item-name">分类</span>
              </a>
            </div>
          

          
            <div class="site-state-item site-state-tags">
              <a href="/blog/tags">
                <span class="site-state-item-count">93</span>
                <span class="site-state-item-name">标签</span>
              </a>
            </div>
          

        </nav>

        

        <div class="links-of-author motion-element">
          
        </div>

        
        

        
        

        


      </section>

      
      <!--noindex-->
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
              
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#主分片"><span class="nav-number">1.</span> <span class="nav-text">主分片</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#副分片"><span class="nav-number">2.</span> <span class="nav-text">副分片</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#数据存储"><span class="nav-number">3.</span> <span class="nav-text">数据存储</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#文档的更新"><span class="nav-number">4.</span> <span class="nav-text">文档的更新</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Elasticsearch并发控制"><span class="nav-number">5.</span> <span class="nav-text">Elasticsearch并发控制</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#批量查找"><span class="nav-number">6.</span> <span class="nav-text">批量查找</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Elasticsearch全文搜索"><span class="nav-number">7.</span> <span class="nav-text">Elasticsearch全文搜索</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Elasticsearch分析器"><span class="nav-number">8.</span> <span class="nav-text">Elasticsearch分析器</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#自定义分析器"><span class="nav-number">8.0.1.</span> <span class="nav-text">自定义分析器</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#使用自定义分析器"><span class="nav-number">8.0.2.</span> <span class="nav-text">使用自定义分析器</span></a></li></ol></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Elasticsearch-查询与过滤"><span class="nav-number">9.</span> <span class="nav-text">Elasticsearch 查询与过滤</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#搜索，查找语法"><span class="nav-number">10.</span> <span class="nav-text">搜索，查找语法</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#简单查询"><span class="nav-number">10.1.</span> <span class="nav-text">简单查询</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#排序相关性"><span class="nav-number">11.</span> <span class="nav-text">排序相关性</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Elasticserach分片存储"><span class="nav-number">12.</span> <span class="nav-text">Elasticserach分片存储</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#如何存储数据"><span class="nav-number">12.1.</span> <span class="nav-text">如何存储数据</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#数据如何保存、更新"><span class="nav-number">12.2.</span> <span class="nav-text">数据如何保存、更新</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#如何提升数据存储性能、安全性"><span class="nav-number">12.3.</span> <span class="nav-text">如何提升数据存储性能、安全性</span></a><ol class="nav-child"><li class="nav-item nav-level-6"><a class="nav-link" href="#保存到内存缓存"><span class="nav-number">12.3.0.0.1.</span> <span class="nav-text">保存到内存缓存</span></a></li></ol></li></ol></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#近实时更新数据以及如何配置"><span class="nav-number">12.4.</span> <span class="nav-text">近实时更新数据以及如何配置</span></a></li></ol></li></ol></div>
            

          </div>
        </section>
      <!--/noindex-->
      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright" >
  
  &copy; 
  <span itemprop="copyrightYear">2019</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">Fang ShuHao</span>
</div>


<div class="powered-by">
  由 <a class="theme-link" href="https://hexo.io">Hexo</a> 强力驱动
</div>

<div class="theme-info">
  主题 -
  <a class="theme-link" href="https://github.com/iissnan/hexo-theme-next">
    NexT.Mist
  </a>
</div>


        

        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    
    
  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  




  
  <script type="text/javascript" src="/blog/lib/jquery/index.js?v=2.1.3"></script>

  
  <script type="text/javascript" src="/blog/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>

  
  <script type="text/javascript" src="/blog/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>

  
  <script type="text/javascript" src="/blog/lib/velocity/velocity.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/blog/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/blog/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>


  


  <script type="text/javascript" src="/blog/js/src/utils.js?v=5.1.0"></script>

  <script type="text/javascript" src="/blog/js/src/motion.js?v=5.1.0"></script>



  
  

  
  <script type="text/javascript" src="/blog/js/src/scrollspy.js?v=5.1.0"></script>
<script type="text/javascript" src="/blog/js/src/post-details.js?v=5.1.0"></script>



  


  <script type="text/javascript" src="/blog/js/src/bootstrap.js?v=5.1.0"></script>



  



  




	





  





  





  
    <script type="text/javascript">
      (function(d, s) {
        var j, e = d.getElementsByTagName(s)[0];
        if (typeof LivereTower === 'function') { return; }
        j = d.createElement(s);
        j.src = 'https://cdn-city.livere.com/js/embed.dist.js';
        j.async = true;
        e.parentNode.insertBefore(j, e);
      })(document, 'script');
    </script>
  



  
  

  

  

  

  


  

</body>
</html>
